package RRHH_Modelo;

import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class RHH_VACACIONES {

    private int ID;
    private Date FECHA_INI;
    private Date FECHA_FIN;
    private int ID_USUARIO;
    private int ESTADO; //0 APROBADA, 1 DESAPROBADA
    private Conexion con = null;

    public RHH_VACACIONES(Conexion con) {
        this.con = con;
    }

    public RHH_VACACIONES(int ID, Date FECHA_INI, Date FECHA_FIN, int ID_USUARIO) {
        this.ID = ID;
        this.FECHA_INI = FECHA_INI;
        this.FECHA_FIN = FECHA_FIN;
        this.ID_USUARIO = ID_USUARIO;
    }

    public int Insertar() throws SQLException {
        String consulta = "insert into BROKER.RHH_VACACIONES (ID, FECHA_INI, FECHA_FIN, ID_USUARIO) VALUES (" + ID + ",to_date('" + getFECHA_INI() + "','dd/MM/yyyy HH24:MI:SS'),to_date('" + getFECHA_FIN() + "','dd/MM/yyyy HH24:MI:SS')," + ID_USUARIO + ")";
        con.EjecutarSentencia(consulta);
        consulta = "select BROKER.RHH_VACACIONES_SEQ.currval as ID from dual";
        ResultSet rs = con.EjecutarConsulta(consulta);
        rs.next();
        return rs.getInt("ID");
    }

    public boolean EliminarXid() throws SQLException {
        String consulta = "delete from BROKER.RHH_VACACIONES where ID= " + getID()+" AND FECHA_INI > SYSDATE";
        con.EjecutarSentencia(consulta);
        String consulta1 = "select * from BROKER.RHH_VACACIONES where ID= " + getID();
        ResultSet rs = con.EjecutarConsulta(consulta1);
        if(rs.next())
            return false;
        else
            return true;
    }
    public boolean EliminarXid(int id) throws SQLException {
        String consulta = "delete from BROKER.RHH_VACACIONES where ID= "+id+" AND FECHA_INI > SYSDATE";
        con.EjecutarSentencia(consulta);
        String consulta1 = "select * from BROKER.RHH_VACACIONES where ID= " + id;
        ResultSet rs = con.EjecutarConsulta(consulta1);
        if(rs.next())
            return false;
        else
            return true;
    }
    
    public boolean Aprobar(int id) throws SQLException {
        String consulta = "update BROKER.RHH_VACACIONES set ESTADO =0 where ID= " + id;
        con.EjecutarSentencia(consulta);
        return true;
    }
    public List<RHH_VACACIONES> buscarxUsuario(String usuario,int estado) throws SQLException {
        String consulta = "SELECT RHH_VACACIONES.*\n" +
                          "FROM BROKER.RHH_VACACIONES, BROKER.RHH_USUARIO\n" +
                          "WHERE (RHH_VACACIONES.ID_USUARIO = RHH_USUARIO.ID)\n" +
                          "AND (RHH_VACACIONES.ESTADO = "+estado+")\n" +
                          "AND UPPER(RHH_USUARIO.USUARIO) like(UPPER('"+usuario+"%'))";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_VACACIONES> lista = Cargar(rs);
        return lista;
    }
    public List<RHH_VACACIONES> buscarxfecha(String fechaIni,String fechaFin,int estado) throws SQLException {
        String consulta = "SELECT RHH_VACACIONES.*\n" +
                          "FROM BROKER.RHH_VACACIONES\n" +
                          "WHERE (RHH_VACACIONES.ESTADO = "+estado+")\n" +
                          "AND (RHH_VACACIONES.FECHA_INI BETWEEN TO_DATE('"+fechaIni+"','DD/MM/YYYY') AND TO_DATE ('"+fechaFin+"','DD/MM/YYYY'))";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_VACACIONES> lista = Cargar(rs);
        return lista;
    }
    private void rechazarViejos() throws SQLException
    {
        String consulta = "delete BROKER.RHH_VACACIONES  where ESTADO = 1 and FECHA_INI<SYSDATE";
        con.EjecutarSentencia(consulta);
    }
    
    public RHH_VACACIONES Buscar(int id) throws SQLException {
        String consulta = "select * from BROKER.RHH_VACACIONES where ID = " + id;
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);
    }

    public List<RHH_VACACIONES> TodosxDia(int id_usr, String fecha) throws SQLException {
        rechazarViejos();
        String consulta = "SELECT RHH_VACACIONES.*\n" +
                        "FROM BROKER.RHH_VACACIONES\n" +
                        "WHERE (RHH_VACACIONES.ID_USUARIO = "+id_usr+")\n" +
                        "AND (to_date(RHH_VACACIONES.FECHA_INI,'DD/MM/YYYY') LIKE TO_DATE ('"+fecha+"', 'DD/MM/YYYY'))";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_VACACIONES> lista = Cargar(rs);
        return lista;
    }
    
    public int canthoras(int id_usr) throws SQLException {
        String consulta = "SELECT SUM(RHH_VACACIONES_PARAMETRIZACION.HORAS)-(\n" +
                        " select  case when (SELECT SUM(TO_CHAR(RHH_VACACIONES.FECHA_FIN,'HH24') - TO_CHAR(RHH_VACACIONES.FECHA_INI,'HH24')) AS HORA\n" +
                        " FROM BROKER.RHH_VACACIONES \n" +
                        " WHERE (RHH_VACACIONES.ID_USUARIO = "+id_usr+")) is null then 0 else (SELECT SUM(TO_CHAR(RHH_VACACIONES.FECHA_FIN,'HH24') - TO_CHAR(RHH_VACACIONES.FECHA_INI,'HH24')) AS HORA\n" +
                        " FROM BROKER.RHH_VACACIONES \n" +
                        " WHERE (RHH_VACACIONES.ID_USUARIO = "+id_usr+")) end from dual) as horas\n" +
                        " FROM BROKER.RHH_VACACIONES_PARAMETRIZACION\n" +
                        " WHERE RHH_VACACIONES_PARAMETRIZACION.ANO<= (SELECT TRUNC((SELECT SYSDATE-RHH_FECHAS_HITO.FECHA FROM BROKER.RHH_FECHAS_HITO WHERE (RHH_FECHAS_HITO.ID_EVENTO_HITO = 3) AND (RHH_FECHAS_HITO.ID_USUARIO = "+id_usr+"))/365)AS AÑOS  FROM DUAL ) GROUP BY 2";
        ResultSet rs = con.EjecutarConsulta(consulta);
        if(rs.next())
            return rs.getInt("HORAS");
        else
            return 0;
    }
    
    public int CANT_VACACIONES_TOMADAS_POR_AÑO(int id_usr, int ano) throws SQLException {
        String consulta = "SELECT sum(TO_CHAR(RHH_VACACIONES.FECHA_FIN,'HH24')- TO_CHAR(RHH_VACACIONES.FECHA_INI,'HH24'))/8 AS DIAS\n" +
                            "FROM BROKER.RHH_VACACIONES\n" +
                            "WHERE TO_CHAR(RHH_VACACIONES.FECHA_INI,'YYYY') = '"+ano+"'\n" +
                            "AND (RHH_VACACIONES.ESTADO = 0)\n" +
                            "AND RHH_VACACIONES.ID_USUARIO = "+id_usr;
        ResultSet rs = con.EjecutarConsulta(consulta);
        if(rs.next())
            return rs.getInt("DIAS");
        else
            return 0;
    }
    
    public List<RHH_VACACIONES> Todos() throws SQLException {
        rechazarViejos();
        String consulta = "  SELECT RHH_VACACIONES.*\n" +
                            "FROM BROKER.RHH_VACACIONES\n" +
                            "WHERE (RHH_VACACIONES.ESTADO = 1)\n" +
                            "ORDER BY RHH_VACACIONES.FECHA_INI ASC, RHH_VACACIONES.ID_USUARIO ASC";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_VACACIONES> lista = Cargar(rs);
        return lista;
    }    
    public List<RHH_VACACIONES> TodosAprobados() throws SQLException {
        rechazarViejos();
        String consulta = "  SELECT RHH_VACACIONES.*\n" +
                            "FROM BROKER.RHH_VACACIONES\n" +
                            "WHERE (RHH_VACACIONES.ESTADO = 0)\n" +
                            "ORDER BY RHH_VACACIONES.FECHA_INI ASC, RHH_VACACIONES.ID_USUARIO ASC";
        ResultSet rs = con.EjecutarConsulta(consulta);
        List<RHH_VACACIONES> lista = Cargar(rs);
        return lista;
    }    

    public List<RHH_VACACIONES> Cargar(ResultSet rs) throws SQLException {
        List<RHH_VACACIONES> lista = new ArrayList<RHH_VACACIONES>();
        while (rs.next()) {
            RHH_VACACIONES objeto = new RHH_VACACIONES(con);
            objeto.setID(rs.getInt("ID"));
            objeto.setFECHA_INI(rs.getDate("FECHA_INI"));
            objeto.setFECHA_FIN(rs.getDate("FECHA_FIN"));
            objeto.setESTADO(rs.getInt("ESTADO"));
            objeto.setID_USUARIO(rs.getInt("ID_USUARIO"));
            lista.add(objeto);
        }
        return lista;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getFECHA_INI() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        return sdf.format(FECHA_INI);
    }
    public String getFECHA_INISinHora() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MMMM/yyyy kk:mm");
        return sdf.format(FECHA_INI);
    }

    public void setFECHA_INI(Date FECHA_INI) {
        this.FECHA_INI = FECHA_INI;
    }

    public String getFECHA_FIN() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MMMM/yyyy kk:mm");
        return sdf.format(FECHA_FIN);
    }
    
     public String getHORA_INICIOSF() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        return sdf.format(FECHA_INI);
    }
    public String getHORA_FINSF() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        return sdf.format(FECHA_FIN);
    }

    public void setFECHA_FIN(Date FECHA_FIN) {
        this.FECHA_FIN = FECHA_FIN;
    }

    public int getID_USUARIO() {
        return ID_USUARIO;
    }

    public void setID_USUARIO(int ID_USUARIO) {
        this.ID_USUARIO = ID_USUARIO;
    }

    public Conexion getCon() {
        return this.con;
    }

    public void setCon(Conexion con) {
        this.con = con;
    }

    public int getESTADO() {
        return ESTADO;
    }

    public void setESTADO(int ESTADO) {
        this.ESTADO = ESTADO;
    }
    
}
